﻿using System;
using System.Configuration;
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GanagroLiteData;
using Csla.Validation;
using GeneralUtilities;
using System.Text.RegularExpressions;

namespace GanagroLiteBO
{
    public partial class CompraBO : IOperacion
    {
        #region private fields
         GANADO_BO _currentGanado;
         Parametros _parametros;

        #endregion

        #region public properties

         private short? _Peso;

         public short? Peso
         {
             get { return _Peso; }
             set
             {
                 if (_Peso != value)
                 {
                     _Peso = value;
                     this.VALOR1 = value;
                     FirePropertyChangedNotification("Peso");
                 }
             }
         }

         private string _marca;
         public string Marca
         {
             get { return _marca; }

             set
             {
                 _marca = value;
             }
         }
         


        #endregion

        #region constructors
        public CompraBO(List<string> contenedor, OpArgs opArgs, NotaBO nota)
        {
            this.Contenedor = contenedor;
            this.OPERACION = (short)opArgs.TipoOperacion;

            this.Edad = opArgs.Edad;
            this.Sexo = "M";
            this.Estado = opArgs.Estado;
            this.Lote = opArgs.Lote;
            this.FECHA = nota.Fecha;
            this.Marca = opArgs.Marca;

            _currentGanado = new GANADO_BO();
            _currentGanado.Activo = 1;
            _currentGanado.FINCA  = opArgs.Finca;
            _currentGanado.LOTE   = opArgs.Lote;
            _currentGanado.ESTADO = opArgs.Estado;
            _currentGanado.SEXO   = opArgs.Sexo;
            _currentGanado.FECHANAC = nota.Fecha.AddMonths(opArgs.Edad * -1);
            _currentGanado.RAZA1    = 0;
            _currentGanado.RAZA2    = 0;
            _currentGanado.FECHA_ENTRADA = nota.Fecha;
            _currentGanado.MARCA = opArgs.Marca;

            if (utilities.GetParametro(Pars.NumeracionAutomatica).ToUpper() == "SI")
            {
                string nextCodigo = (contenedor.Count > 0) ? contenedor.Max() : string.Empty;
                Match m = Regex.Match(nextCodigo, @"\d+$");

                if (m.Success)
                {
                    this.CODIGO = nextCodigo.Substring(0, m.Index) + (int.Parse(m.Value) + 1).ToString();
                    _currentGanado.CODIGO = this.CODIGO;
                }
            }

            this.AlOjo = opArgs.Alojo;

            if (_alOjo == true)
                this.VALOR1 = 0;
            else
                this.VALOR1 = Peso;

            this.ValorKilo = opArgs.ValorKilo;
            this.VALOR2 = opArgs.ValorKilo;

            _parametros = new Parametros();

            AddAdtlBusinessRules();

            this.Peso = 0;

        }

        private CompraBO()
        {
            _parametros = new Parametros();
        }

        #endregion

        #region Methods
        new public void Guardar()
        {
            _currentGanado.CODIGO = CODIGO;
            _currentGanado.FECHANAC = this.FECHA.AddMonths(Edad * -1).Date;
            _currentGanado.ESTADO = this.Estado;
            _currentGanado.LOTE = this.Lote;
            _currentGanado.SEXO = this.Sexo ;
            _currentGanado.FECHA_ENTRADA = FECHA.Date;
            _currentGanado.FECHADES = Convert.ToDateTime("1900-01-01");
            _currentGanado.FECHASAL = Convert.ToDateTime("1900-01-01");
            _currentGanado.MARCA = this.Marca;
            _currentGanado.Guardar();

            if (_alOjo == true)
                this.VALOR1= 0;
            else
                this.VALOR1 = Peso;

            this.VALOR2 = ValorKilo;

            // El siguiente codigo Guardar la operacion tanto en pesajes como en Operaciones

            PESAJES_BO _pesajesBO = new PESAJES_BO();
            _pesajesBO.lote = this.Lote;
            _pesajesBO.CODIGO = this.CODIGO;
            _pesajesBO.FECHA= this.FECHA;
            _pesajesBO.OPERACION = (short)TiposOperacion.compra;
            _pesajesBO.Peso = (short)(this.Peso??0);
            _pesajesBO.Guardar();

            base.Guardar();
        }

        #endregion

        #region Validation Rules

        private static bool ValidaNuevoCodigo<T>(T target, RuleArgs e) where T : CompraBO
        {
            string message = string.Empty;
            bool success = true;

            if (utilities.CodigoEsValido(target._CODIGO, ref message, (TiposOperacion)target.OPERACION) == false) 
            {
                e.Description = message;
                success = false;
            }

            return success;
        }

        private static bool ValidaPeso<T>(T target, RuleArgs e) where T : CompraBO 
        {
            e.Description = string.Empty;
            bool success = false;
            if (target._CODIGO == null)
            {
                success = true;
            }
            else
            {
                success = (target._alOjo == true) ||  utilities.ValidaPeso(target.Peso, e);
            }

            return success;
        }

        protected void AddAdtlBusinessRules()
        {
            try
            {
                ValidationRules.AddRule(new Csla.Validation.RuleHandler<CompraBO, RuleArgs>(ValidaPeso), "Peso");
                ValidationRules.AddRule(new Csla.Validation.RuleHandler<CompraBO, RuleArgs>(ValidaNuevoCodigo), "CODIGO");
                //ValidationRules.AddRule(new Csla.Validation.RuleHandler(CommonRules.IntegerMinMaxValue),
                //                        new CommonRules.IntegerMinMaxValueRuleArgs("Peso", 
                //                                                                   parametros.GetVal(Pars.PesoMinimo),
                //                                                                   parametros.GetVal(Pars.PesoMaximo),
                //                                                                   "Kilos")
                //                                                                   );

            }
            catch (Exception ex)
            {
                throw (new Exception("AddAdtlBusinessRules: " + ex.Message, ex));
            }
        }

        #endregion

    }

    public class Compras : BindingListView<CompraBO> 
    {
        //public bool HasValidItem()
        //{
        //    return ((this.Count > 0) && 
        //        ((this.First().CODIGO ?? string.Empty) != string.Empty) &&
        //        this.Any(p => ((p.CODIGO ?? string.Empty) != string.Empty) && (p.IsValid(true) == true)));
        //}

        public void SetAlojo(bool bVal)
        {
            foreach (CompraBO item in this)
            {
                item.AlOjo = bVal;
                item.IsValid(false);
            }
        }

        public void Setfecha(DateTime fecha)
        {
            foreach (CompraBO item in this)
            {
                item.FECHA = fecha.Date;
                item.IsValid();
            }
        }

        public void SetEdad(short edadMeses)
        {
            foreach (CompraBO item in this)
            {
                item.Edad = edadMeses;
            }
        }

        public void SetLote(byte lote)
        {
            foreach (CompraBO item in this)
            {
                item.Lote = lote;
            }
        }

        public void SetMarca(string marca)
        {
            foreach (CompraBO item in this)
            {
                item.Marca = marca;
            }
        }

        public void Setprecio(short precio)
        {
            foreach (CompraBO item in this)
            {
                item.VALOR2 = precio;
                item.ValorKilo = precio;
            }
        }
    }

}
